摄像机优化
除去普通行进的镜头平滑移动外,在 Dash 或者 Sprint 等的操作时候也需要有一些特殊的“运镜”,才会使得画面更灵活,力量感画面感电影感(各种感等)才能出来。
FOV 设置
FOV,即 Field of View,也就是常说的视野(单独开一篇说明这个事情吧)
FOV 越大:
- 视野越广
- 画面边缘透视越明显
- 速度感越强
FOV 越小:
- 视野越窄
- 构图更集中
- 压缩感更强
在默认镜头的 FOV 下,我们可以在 Dash 和 Sprint 触发的时候增加 FOV 达到提升速度感的镜头效果
具体实现 ——
- Dash:瞬时到一个高速度, 所以直接赋值修改 FOV,并且在结束触发回调函数的时候把 FOV 改回默认大小
- Sprint:由于是一个长时间的状态,所以在改变 FOV 的时候做一个插值平滑过渡
SpringArm
第三人称相机臂。
负责 ——
- 让相机和角色保持距离
- 发生碰撞时自动收缩
- 让相机跟随角色
- 提供 CameraLag / RotationLag
主要可以使得镜头更柔和,不那么生硬机械(作用和 Unity 中的 Cinemachine 类似
代码设计
做个数据驱动,单独把相机参数拉成一个DataAsset
不如贴出来直观 ——
C++
UCLASS()
class SAKURA_API USakuraCameraTuningData : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|FOV", meta = (ClampMin = "30.0", ClampMax = "120.0"))
float DefaultFOV = 80.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|FOV", meta = (ClampMin = "30.0", ClampMax = "120.0"))
float SprintFOV = 88.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|FOV", meta = (ClampMin = "0.0"))
float FOVInterpSpeed = 8.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Dash", meta = (ClampMin = "0.0"))
float DashFOVKick = 6.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Dash", meta = (ClampMin = "0.0"))
float DashFOVKickHoldTime = 0.08f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|SpringArm", meta = (ClampMin = "0.0"))
float TargetArmLength = 420.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|SpringArm")
FVector SocketOffset = FVector(0.0f, 55.0f, 65.0f);
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag")
bool bEnableCameraLag = true;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag", meta = (ClampMin = "0.0"))
float CameraLagSpeed = 12.0f;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag")
bool bEnableCameraRotationLag = true;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera|Lag", meta = (ClampMin = "0.0"))
float CameraRotationLagSpeed = 16.0f;
};把 SpringArm 的设置参数也一起抽离到数据资产中,方便进行配置
同时把相机调整的方法抽成一个单独的 Component, 然后把需要调整的 UCameraComponent 和 InCameraBoom 以及调整数据 InCameraTuningData 做依赖注入,由 Character 在 BeginPlay 阶段做初始化